Autenticação
A API do Woofed CRM autentica toda requisição com um JWT Bearer Token. Existe um único tipo de token — não há chaves "publicáveis" ou "secretas" separadas, e não há fluxo OAuth.
Como funciona
- Você obtém um token JWT no painel de administração — veja o guia Obter Token.
- Você inclui esse token no cabeçalho
Authorizationde toda requisição da API:
Authorization: Bearer SEU_TOKEN_AQUI
- O token identifica o usuário em nome de quem a chamada está sendo feita, ou seja, todas as permissões, logs de auditoria e regras de propriedade se comportam exatamente como se aquele usuário tivesse feito a ação pela UI.
O token é uma credencial
Um token do Woofed CRM pode ler e modificar todos os dados que o usuário dono dele consegue ver. Trate-o como uma senha.
Enviando o token
O cabeçalho é o mesmo independentemente da linguagem ou cliente HTTP que você usa.
curl
curl -X GET "https://app.woofedcrm.com/api/v1/accounts/1/contacts/1" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer SEU_TOKEN_AQUI"
JavaScript / fetch
const res = await fetch(
"https://app.woofedcrm.com/api/v1/accounts/1/contacts/1",
{
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${process.env.WOOFED_TOKEN}`,
},
}
);
Node.js / axios
import axios from "axios";
const woofed = axios.create({
baseURL: "https://app.woofedcrm.com/api/v1/accounts/1",
headers: {
Authorization: `Bearer ${process.env.WOOFED_TOKEN}`,
"Content-Type": "application/json",
},
});
const { data } = await woofed.get("/contacts/1");
Python / requests
import os
import requests
headers = {
"Authorization": f"Bearer {os.environ['WOOFED_TOKEN']}",
"Content-Type": "application/json",
}
r = requests.get(
"https://app.woofedcrm.com/api/v1/accounts/1/contacts/1",
headers=headers,
)
r.raise_for_status()
print(r.json())
Ruby / Net::HTTP
require "net/http"
require "json"
uri = URI("https://app.woofedcrm.com/api/v1/accounts/1/contacts/1")
req = Net::HTTP::Get.new(uri)
req["Authorization"] = "Bearer #{ENV['WOOFED_TOKEN']}"
req["Content-Type"] = "application/json"
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }
puts JSON.parse(res.body)
Erros comuns de autenticação
| Status | Significado | O que verificar |
|---|---|---|
401 Unauthorized | Token ausente, mal formatado ou expirado | O cabeçalho está exatamente como Authorization: Bearer <token> (atenção ao espaço, sem aspas em volta do token, sem espaços antes ou depois). |
403 Forbidden | Token válido, mas o usuário não tem acesso ao recurso | O usuário dono do token pertence à conta correta e tem permissão sobre o recurso. |
404 Not Found | account_id errado na URL, ou o registro não existe nessa conta | O token pertence a um usuário da mesma conta que aparece na URL. |